package com.zh.java;

import java.util.HashMap;
import java.util.Map;

/**
 * 最简单的单例模式讲解类
 * 
 * 1.单例模式就是限制类不能通过NEW 构造方法去创建对象。把他用private修饰构造方法。这样外界就调用不了。
 * 
 * 2.自己本身的对象用static修饰。这样保证静态，永远不会销毁。保证他有一份对象实例。
 * 
 * 3.那么要创建这个对象。需要提供一个共有的静态方法。把只返回一份实例的逻辑包含在里面。
 * 
 * 4.单例模式 一般用在配置文件的加载，因为配置文件是死的，不需要反复创建对象。只要有一份对象就行了。
 * 
 * @author Eric Zheng   
 * 
 * @email 18118800007@163.com
 *
 * @date 2018-03-20
 * 
 */

public class DanLi {
	//申明一个私有的 静态自己类型的变量：用于别人访问不到。只有类私有，自己才能访问
	private static  DanLi danli;
	//私有化构造方法。这样别人也创建不了。调用不了 new DanLi()这个方法创建对象。
	private DanLi(){
		System.out.println("-----------构造方法被自己访问了1次----------");
	}
	//那么这个对象只能通过这个public方法 通过返回值返回一个对象。
	public static DanLi getInstance(){
		System.out.println("调用getInstance："+System.currentTimeMillis());
		
		//进行判断。如果没有创建对象就创建一个，创建成功后，他就会在内存里。因为他是static修饰的。 永远都会再。
		if(danli==null){
			danli=new DanLi();
		}
		//第二次再调用这个方法的时候 就不需要再创建了。就拿之前在内存里的那个对象。
		return danli;
	}
	
	
	
	public static void main(String[] args) {
		//正常创建对象 应该向下面这样
		//DanLi danLi  = new Danli();//可是报错
		//所以只有通过public的getInstance方法去实例化对象
		DanLi danLi = DanLi.getInstance();
		DanLi danLi2 = DanLi.getInstance();
		
		//通过打印结果，你会看到“构造方法被自己访问了1次”只打印了1次，getInstance方法调用了2次。
		//表明，第一次getInstance，因为系统中没有这个对象，就调用自身的构造方法创建了一个对象，第二次调用的时候，系统中有了之前创建的那个。就没再调用构造方法了。
		//
		Map<String, String> map  = new HashMap<String, String>();
	}
		

}
